package kassa;
/**
 * Write a description of class test here.
 * 
 * @author (Gerben, Nick, Dennis) 
 * @version (v0.1)
 */

import java.io.*;
import java.util.*;
import java.sql.*;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.net.*;
import java.util.Date;

public class Kassa{
    BufferedReader toetsenbord = new BufferedReader( new InputStreamReader( System.in) );
    public static final String DATE_FORMAT_NOW = "dd-MM-yyyy";
    private ArrayList<Medewerker> medewerker = new ArrayList<Medewerker>();
    private ArrayList<Artikel> artikel = new ArrayList<Artikel>();
    private ArrayList<Bon> bon = new ArrayList<Bon>();
    private ArrayList<Bonregel> bonregel = new ArrayList<Bonregel>();
    Database database = new Database();
    private int kassaNummer = 1;
    private int invoegNummer;
    private int inlogaccount = -1;
    private int idMedewerker;
    int check = 0;
    private String rechten = null;
    
    /**Start**/
    public void starten(){
        if(check==0){
            dbNaarArrayMedewerker();
            check = 1;
        }
        inlogmenu();
    }
    /**Hoofdmenu Administrator**/
    public void hoofdmenuAdministrator(){
            dbNaarArrayMedewerker();
            System.out.println(check);
            System.out.print("\f");
            System.out.println("Welkom op Kassa " + kassaNummer + " van de Media Markt ");
            System.out.println();
            System.out.println("Toets 1 om een nieuwe kassa medewerk(st)er toe te voegen");
            System.out.println("Toets 2 om een medewerker te wijzigen");
            System.out.println("Toets 3 om een medewerker te verwijderen");
            System.out.println("Toets 4 voor een overzicht van de medewerkers");
            System.out.println("Toets 5 om een artikel te scannen");
            System.out.println("Toets 6 om een dagomzet te bekijken per kassa");
            System.out.println("Toets 7 om uit te loggen");
            System.out.println();
            String keuze = null;
            keuze=stelVraag("");          
            if(!keuze.equals("1") && !keuze.equals("2") && !keuze.equals("3") && !keuze.equals("4") && !keuze.equals("5") && !keuze.equals("6") && !keuze.equals("7"))
            {
                hoofdmenuAdministrator();
            }
    
            if(keuze.equalsIgnoreCase("1")) 
            {
                toevoegenMedewerker();
            }

            if(keuze.equalsIgnoreCase("2")) 
            {
                wijzigenMedewerker();
            }
            
            if(keuze.equalsIgnoreCase("3")) 
            {
                verwijderMedewerker();
            }
            
            if(keuze.equalsIgnoreCase("4")) 
            {
               printOverzicht();
            }
            
            if(keuze.equalsIgnoreCase("5")) 
            {
                maakBon();
            }
            
            if(keuze.equalsIgnoreCase("6")) 
            {
                dagOmzet();
            }
            
            if(keuze.equalsIgnoreCase("7"))
            {          
                System.out.println("\f");
                inlogmenu();
            }
    }
        
    /**Hoofdmenu Medewerker**/
            public void hoofdmenuMedewerker(){
            dbNaarArrayMedewerker();
            System.out.println(check);
            System.out.println();        
            System.out.println("Toets 1 om een artikel te scannen");
            System.out.println("Toets 2 voor een overzicht van de medewerkers");
            System.out.println("Toets 3 om uit te loggen");
            System.out.println();
            String keuze = null;
            keuze=stelVraag("");          
            if(!keuze.equals("1") && !keuze.equals("2") && !keuze.equals("3"))
            {
                hoofdmenuMedewerker();
            }
    
            if(keuze.equalsIgnoreCase("1")) 
            {
                maakBon();
            }

            if(keuze.equalsIgnoreCase("2")) 
            {
                printOverzicht();
            }
            
            if(keuze.equalsIgnoreCase("3")) 
            {
                System.out.println("\f");
                inlogmenu();
            }
}
    
    /**Inlogmenu**/
          public void inlogmenu(){
            dbNaarArrayMedewerker();
            System.out.println(check);
            System.out.print("\f");
            System.out.println("Welkom op Kassa " + kassaNummer + " van de Media Markt ");
            System.out.println();
            System.out.println("Toets 1 om in te loggen");
            System.out.println("Toets 2 voor een overzicht van de medewerkers");
            System.out.println("Toets 3 om af te sluiten");
            System.out.println();
            String keuze = null;
            keuze=stelVraag("");          
            if(!keuze.equals("1") && !keuze.equals("2") && !keuze.equals("3"))
            {
                inlogmenu();
            }
    
            if(keuze.equalsIgnoreCase("1")) 
            {
               inloggenMedewerker();
            }

            if(keuze.equalsIgnoreCase("2")) 
            {
                printOverzichtInlog();
            }
            
            if(keuze.equalsIgnoreCase("3")) 
            {
                System.out.println("\f");
                System.exit(0);
            }
        }
        
    /**Stel vraag**/
    String stelVraag( String vraag )
     {
         try
         {
             System.out.print( vraag );
             String naam = toetsenbord.readLine();
             return naam;
         }
         catch( IOException ioe )
         {
            System.out.println( "Fout bij inlezen");
        }
            return "";
    }
    /**data ophalen **/
    
    public void dbNaarArrayMedewerker()
    {
        medewerker.clear();
        try{
            ResultSet rs = database.executeSQLStatement("SELECT nummer FROM medewerker order by nummer");
            while (rs.next ()){
                int nummer = rs.getInt ("nummer");
                medewerker.add(new Medewerker(nummer));      
            }
            rs.close();     
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        }
        try{
            ResultSet rs1 = database.executeSQLStatement("SELECT ID FROM artikelen order by ID");
            while (rs1.next ()){
                int ID = rs1.getInt ("ID");
                artikel.add(new Artikel(ID));      
            }
            rs1.close();     
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        } 
    }
    
    public void dbNaarArrayArtikelen()
   {
        artikel.clear();
        try{
            ResultSet rs = database.executeSQLStatement("SELECT * FROM artikelen order by ID");
            while (rs.next ()){
                int ID = rs.getInt("ID");
                String naam = rs.getString("artikelnaam");
                double inkoop = rs.getDouble("inkoopprijs");
                double verkoop = rs.getDouble ("verkoopprijs");
                int categorie = rs.getInt ("categorie");
                int subcategorie = rs.getInt ("subcategorie");
                int voorraad = rs.getInt ("voorraad");
                int minVoorraad = rs.getInt ("minVoorraad");
                String locatie = rs.getString ("locatie");
                int garantie = rs.getInt ("Garantie");
                artikel.add(new Artikel(ID, naam, inkoop, verkoop, voorraad, minVoorraad, categorie, subcategorie, locatie, garantie));
            }
            rs.close();     
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        }
   }
   
    /** medewerker opties **/
    public void inloggenMedewerker()
    {       
            System.out.println("\f\nAls u een onjuiste combinatie ingeeft wordt u terug naar het hoofdmenu gestuurd." );
            String nummerString = null;
            inlogaccount = 0;
            String wachtwoord = null;
            try
            {
                inlogaccount =Integer.parseInt ( stelVraag("Voer uw nummer in:") );
                for(Medewerker m : medewerker){
                  	if(inlogaccount==(m.getNummer())){      
                       	wachtwoord = stelVraag("Voer uw wachtwoord in: ");
                  		if(wachtwoord.equals(m.getWachtwoord())){
                   		    rechten = m.getRechten();
                   		    System.out.print("\f");
                   		    System.out.println("Welkom " + m.getNaam() + ",");
                   			menuSelectie();
                   	    }
                   }
                }
                inlogmenu();
            }
            catch(Exception e){
                System.out.println("Geen geldig getal ingelezen.");
                wait(3000);
                inlogmenu();
            }     
    }
    
    public void menuSelectie()
    {
       if(rechten.equals( "Administrator")){
          hoofdmenuAdministrator();
       }else{
          hoofdmenuMedewerker();
       }
    }
    
     public void toevoegenMedewerker(){
         String naam = null;  
         String wachtwoord = null;
         String rol = null;
         String kiezen = null;
         System.out.print("\f");   
         naam = stelVraag("Voer de naam in van de nieuwe medewerk(st)er: ");
         if(naam.equals(""))
         {
            toevoegenMedewerker();
         }
         wachtwoord = stelVraag("Voer het wachtwoord in van de nieuwe medewerk(st)er: ");      
         if(wachtwoord.equals(""))
         {
             toevoegenMedewerker();
         }      
         kiezen = stelVraag("Welke rol moet uw medewerker hebben?\nToets 1 voor Administrator\nToets 2 voor Medewerker\n");
         if(kiezen.equals("1")) {
            rol = "Administrator";
         }
         if(kiezen.equals("2")){
            rol = "Medewerker";
         }
         if(!kiezen.equals("1") && !kiezen.equals("2")){
            toevoegenMedewerker();
         }
         try
         {
             ResultSet rs = database.executeSQLStatement("SELECT MAX(nummer) AS nummer FROM medewerker");
             while(rs.next())
             {
                 invoegNummer = rs.getInt("nummer");
             }
             invoegNummer++;
             String insert = ("INSERT INTO medewerker set nummer= '" + invoegNummer + "', naam= '" + naam + "', wachtwoord='" + wachtwoord +"',rechten='" + rol + "', ingelogt = '99'");
             database.executeUpdateStatement(insert);
         }
         catch(Exception e)
         {
              System.out.println("Fout tijdens het toevoegen aan de database.");
              e.printStackTrace();
         }
         //Medewerker mNew = new Medewerker(invoegNummer,naam,wachtwoord,rol);
         //medewerker.add(mNew);
         System.out.println("Uw medewerk(st)er is succesvol toegevoegd!");
         System.out.println("Inloggegevens: ");
         System.out.println("Naam: " + naam);
         System.out.println("Nummer: " + invoegNummer);
         System.out.println("Wachtwoord: " + wachtwoord);
         System.out.println("Rol: " + rol);
         System.out.println();
         stelVraag("Druk op een toets gevolgd door enter om terug te keren naar het hoofdmenu");
         hoofdmenuAdministrator();
    }
    
    public void verwijderMedewerker(){
        printMedewerkers();
        int nummer = 0;
        try
        {
            System.out.println();
            nummer = Integer.parseInt( stelVraag("Vul hier uw id nummer in van de medewerker die u wilt verwijderen: "));            
            database.getConnection();
            database.executeSQLStatement("SELECT * FROM medewerker");
            database.executeUpdateStatement("DELETE FROM medewerker WHERE nummer =" + nummer);
            try{
                for(Medewerker m : medewerker){
                    if(m.getNummer()==nummer){
                        System.out.println("De medewerker: " + m.getNaam() + " is succesvol verwijderd.");
                        medewerker.remove(m);
                    }
                }
            }
            catch(ConcurrentModificationException cme){
                stelVraag("Druk op een toets gevolgd door enter om terug te keren naar het hoofdmenu");
                hoofdmenuAdministrator();
            }
            stelVraag("Druk op een toets gevolgd door enter om terug te keren naar het hoofdmenu");
            hoofdmenuAdministrator();
        }
        catch( NumberFormatException ioe ) {
            stelVraag("Geen getal ingelezen.\n Druk op een toets om door te gaan.");
            verwijderMedewerker();
        }
        catch(Exception e)
        {
            System.out.println("Fout in het opgeven van de naam.");
            e.printStackTrace();
        }
    }
    
    public void wijzigenMedewerker(){
        try{
            System.out.print("\f");
            printMedewerkers();
            System.out.println();
            System.out.println("Als u niets in typt blijven de gegevens ongewijzigd.");
            int nummer = Integer.parseInt(stelVraag("Type het nummer van de medewerker die u wilt wijzigen: "));
            Medewerker gevondenMedewerker = zoekMedewerkerOpNummer( nummer );
            if ( medewerker != null ){
                 String naam = stelVraag("Voer de nieuwe naam in: ");
                 if ( !naam.equals( "" ) ){
                     gevondenMedewerker.setMedewerkerNaam(naam);
                     try{
                         database.getConnection();
                         database.executeUpdateStatement("UPDATE medewerker set naam ='" + naam + "'WHERE nummer = " + nummer);
                        }
                        catch(Exception e){
                            System.out.println("Fout in het opgeven van de naam.");
                            e.printStackTrace();
                        }
                    }
                    else {
                        System.out.println("De naam blijft ongewijzigd.");
                    }
                    veranderWachtwoord(gevondenMedewerker, nummer);
                    veranderRol(gevondenMedewerker, nummer);
                }
                else{
                    wijzigenMedewerker();
                }
                stelVraag("Druk op enter om terug te keren naar het hoofdmenu\n");
                hoofdmenuAdministrator();
            }
            catch(NumberFormatException ene){
                stelVraag("Er is een fout opgetreden druk op een toets om door te gaan\n");
                wijzigenMedewerker();
            }
        }
        
   public void veranderWachtwoord(Medewerker gevondenMedewerker, int nummer)
   {
       String wachtwoord = stelVraag("Vul het nieuwe wachtwoord in: ");
            if ( !wachtwoord.equals("")){
                gevondenMedewerker.setMedewerkerWachtwoord(wachtwoord);
                try{
                    database.getConnection();
                      database.executeUpdateStatement("UPDATE medewerker set wachtwoord ='" + wachtwoord + "'WHERE nummer = " + nummer);
                      }
                      catch(Exception e){
                            System.out.println("Fout in het opgeven van het wachtwoord.");
                            e.printStackTrace();
                      }
            }
            else {
                System.out.println("Het wachtwoord blijft ongewijzigd.");
            }
   }
   
   public void veranderRol(Medewerker gevondenMedewerker, int nummer)
   {
        System.out.println("Druk op 1 voor Administrator");
        System.out.println("Druk op 2 voor Medewerker");
        String rol = stelVraag("Vul de nieuwe rol in: ");
        if ( rol.equals("1")){
              gevondenMedewerker.setMedewerkerRechten("Administrator");
              try{
                  database.getConnection();
                  database.executeUpdateStatement("UPDATE medewerker set rechten ='Administrator'WHERE nummer = " + nummer);
              }
              catch(Exception e){
                  System.out.println("Fout in het opgeven van de naam.");
                  e.printStackTrace();
              }
        }
        else{
            if(rol.equals("2")){
                gevondenMedewerker.setMedewerkerRechten("Medewerker");
                try{
                    database.getConnection();
             //       database.executeSQLStatement("SELECT * FROM medewerker");
                      database.executeUpdateStatement("UPDATE medewerker set rechten ='Medewerker' WHERE nummer = " + nummer);
                }
                catch(Exception e){
                    System.out.println("Fout in het opgeven van de naam.");
                    e.printStackTrace();
                }
            }
                        else{
                            System.out.println("De rol blijft ongewijzigd.");
                        }
        }
   }
        
   public Medewerker zoekMedewerkerOpNummer(int nummer){
       for( Medewerker m: medewerker){
           if(nummer == m.getNummer()){
                return m;
            }
        }
        return null;
    }
    
    public void printMedewerkers(){   
        System.out.println("\fOverzicht medewerkers");
        System.out.println("=============================================================================================================================================================");
        System.out.printf("%-5s %-20s %-20s","Nummer","Naam","Rechten");
        System.out.println();
        for(Medewerker m: medewerker){
            m.printMedewerker();
        }
    }
    
    public void printOverzicht(){
        System.out.println("\fOverzicht medewerkers");
        System.out.println("=============================================================================================================================================================");
        System.out.printf("%-5s %-20s %-20s","Nummer","Naam","Rechten");
        System.out.println();
        for(Medewerker m : medewerker){
            m.printMedewerker();
        }
        stelVraag("\nDruk op een toets om door te gaan");
        menuSelectie();
    }
    
    public void printOverzichtInlog(){
        System.out.println("\fOverzicht medewerkers");
        System.out.println("=============================================================================================================================================================");
        System.out.printf("%-5s %-20s %-20s","Nummer","Naam","Rechten");
        System.out.println();
        for(Medewerker m : medewerker){
            m.printMedewerker();
        }
        stelVraag("\nDruk op een toets om door te gaan");
        inlogmenu();
    }
    
    public void maakBon(){
       int bonNr = nieuwBon();
       scanArtikel( bonNr );
    }
    
   public void bonOpslaan( int bonNr ){
       System.out.println("-------------------------------------------------");
       for(Bon b : bon){
           if(b.getID()==bonNr){
               b.print();
            }
        }
        System.out.println("-------------------------------------------------");
        String a = String.format("%-20s %-20s %-20s",
                                  "Aantal","Artikelid","Omzet");
        System.out.println(a);
        System.out.println("-------------------------------------------------");
        for(Bonregel bo : bonregel){
           if(bo.getBonNr()==bonNr){
               bo.print();
            }
        }
        System.out.println("-------------------------------------------------");
    }
    
   public void scanArtikel(int bonNr){
        try{
            String artikelNummer = stelVraag("Toets het artikelnummer in van het product dat u wilt scannen:");
            String aantal1 = stelVraag( "Geef het aantal in: " );
            System.out.println();
            int nummer = Integer.parseInt(artikelNummer);
            int aantal = Integer.parseInt(aantal1);
            if(aantal < 1){
                System.out.println("Dit is niet een geldige waarde");
                scanArtikel(bonNr);
            }
            int voorraad = 0;
            double omzet = 0.0;
            
            for(Artikel a : artikel){
                if (a.getID()==(nummer)){
                    //System.out.println("Artikel gevonden: ");
                    //System.out.printf("%-5s %-20s %-20s %-20s %-20s %-20s %-10s %-20s %-10s %-10s %n","ID", "Artikelnaam","Inkoopprijs","Verkoopprijs","Categorie","Subcategorie","Voorraad","Min. Voorraad","Locatie","Garantie");      
                    //a.printArtikel();
                    System.out.println(a.getArtikelnaam());
                    System.out.println("DEBUG1");
                    int voorraadMinder = a.getVoorraad() - aantal;
                    a.setVoorraad(voorraadMinder);
                    omzet = a.getVerkoopprijs() * aantal;
                    bonregel.add(new Bonregel(bonNr,aantal, nummer, omzet));
                }
            }
            stelVraag("Druk op een toets om terug te keren 1.");
            menuSelectie();
        }
        catch(NumberFormatException nfe){
            stelVraag("fout nummer ingegeven druk op een toets om door te gaan\n");
            scanArtikel(bonNr);
        }
        catch(Exception ioe){
            System.out.println("Er is een fout opgetreden");
            scanArtikel(bonNr);
        }
        /**String keuze = stelVraag("Druk op 1 voor nog een artikel, Druk op 2 om de bon af te drukken");
           if(keuze.equals("1")){
               scanArtikel(bonNr);
           }
           else{
               bonOpslaan(bonNr);
           }
              stelVraag("Druk op een toets om terug te keren 2.");
        menuSelectie();**/
    }
    
    public int nieuwBon(){
       String datum = now();
       int ID = nieuwIDNummer();
       bon.add(new Bon(ID, datum, kassaNummer));
       return ID;
    }    
    
    private int nieuwIDNummer()
    {
        int ID = getAantalIDNummers();
        
        return ID;
    }
    
   public int getAantalIDNummers()
    {
        int ID = 0;
        try{
            ResultSet rs = database.executeSQLStatement("SELECT max(ID) AS ID FROM bon");
            while (rs.next ()){
                ID = rs.getInt ("ID")+1;
                
                return ID;
            }
            rs.close();     
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        }
      return ID;
        
    }
    
    public static String now() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
        return sdf.format(cal.getTime());
    }    
    public void dagOmzet(){
        String ingevuld = stelVraag("Geef het kassanummer van de kassa waarvan u de dagomzet wilt zien,\nof druk op '0' om het van alle kassa's bij elkaar te zien: ");
        if(ingevuld.equals("stop")||ingevuld.equals(""))
        {
            hoofdmenuAdministrator();
        }
        int kassanummer = Integer.parseInt(ingevuld);
        
        if(kassanummer == 0)
        {
            totaleOmzetAlleKassas();
        }
        else
        {
            //totaleOmzetPerKassa(int kassanummer);
        }
    }
    
    public void totaleOmzetAlleKassas()
    {
        try{
            ResultSet rs = database.executeSQLStatement("SELECT SUM(omzet) AS omzet FROM bonregel");
            while (rs.next ()){
                double omzet = rs.getDouble ("omzet");
                System.out.println("De dagomzet voor alle kassa's is: " + omzet + " euro.");
            }
            rs.close();
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        }
        //wacht(4);
    }
    
    
    /**    
    public void dagOmzet(){
        String date = stelVraag("Geef een datum op waarvan u de dagomzet wilt bekijken: (dd-mm-yyyy): ");
        String kassa = stelVraag("Geef een kassa nummer op, van welke u de dagomzet wilt bekijken: ");
        String datum = stringDatumSplit ( date );
         double dagOmzet = 0.0;
         try{
            ResultSet rs = Database.executeSQLStatement("SELECT bon.* ,bonregel.* FROM bon ,bonregel where bon.ID = bonregel.bonNr AND bon.kassa="+kassa); // Selecteer alles van de tabel scores order op aantal en haal 10 rijen uit de database
            while (rs.next ()) 
            {
                String dbDatum = stringDatumSplit( rs.getString("datum") );
                int ID = rs.getInt("id");
                if(datum.equals(dbDatum)){
                    dagOmzet += rs.getDouble("omzet");
                }
            }
            rs.close();    
            System.out.println("De dag omzet is: " + dagOmzet + " euro");
        }
        catch(Exception e)
        { 
            e.printStackTrace();
        }
        stelVraag("Druk op een toets om terug te keren.");
        hoofdmenuAdministrator();
        
    }
   
    public String stringDatumSplit( String date ){
        char plek1= date.charAt(0);
        char plek2 = date.charAt(1);
        char plek3= date.charAt(3);
        char plek4 = date.charAt(4);
        char plek5= date.charAt(6);
        char plek6 = date.charAt(7);
        char plek7= date.charAt(8);
        char plek8 = date.charAt(9);
        String sdb1 = Character.toString(plek1);
        String sdb2 = Character.toString(plek2);
        String sdb3 = Character.toString(plek3);
        String sdb4 = Character.toString(plek4);
        String sdb5 = Character.toString(plek5);
        String sdb6 = Character.toString(plek6);
        String sdb7 = Character.toString(plek7);
        String sdb8 = Character.toString(plek8);
        String datum = sdb1+sdb2+sdb3+sdb4+sdb5+sdb6+sdb7+sdb8;
        return datum;
    } **/
    
    public static void wait (int n){
        long t0,t1;
        t0=System.currentTimeMillis();
        do{
            t1=System.currentTimeMillis();
        }
        while (t1-t0<1000);
    }
}